/*
 * Copyright (C) 2008,2009,2010,2011  Paulo Cesar Pereira de Andrade.
 *
 * This is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * Authors:
 *	Paulo Cesar Pereira de Andrade
 */

#ifndef _edata_h
#define _edata_h

#include "etypes.h"

/*
 * Prototypes
 */
extern etag_t *
edata(eobject_t list);

extern etag_t *
esymbol_load(esymbol_t *name);

extern etag_t *
esymbol_store(esymbol_t *name, eobject_t value);

extern etag_t *
esymbol_setop(esymbol_t *name, eobject_t value, ecode_t code);

extern etag_t *
esymbol_incdec(esymbol_t *name, ebool_t post, ecode_t code);

extern etag_t *
esymbol_address(esymbol_t *name);

extern etag_t *
evector_load(eobject_t list);

extern etag_t *
evector_store(eobject_t list, eobject_t value);

extern etag_t *
evector_setop(eobject_t list, eobject_t value, ecode_t code);

extern etag_t *
evector_incdec(eobject_t list, ebool_t post, ecode_t code);

extern etag_t *
evector_address(eobject_t list);

extern etag_t *
estruct_load(eobject_t list);

extern etag_t *
estruct_store(eobject_t list, eobject_t value);

extern etag_t *
estruct_setop(eobject_t list, eobject_t value, ecode_t code);

extern etag_t *
estruct_incdec(eobject_t list, ebool_t post, ecode_t code);

extern etag_t *
estruct_address(eobject_t list);

extern etag_t *
eclass_load(esymbol_t *name);

extern etag_t *
eclass_store(esymbol_t *name, eobject_t value);

extern etag_t *
eclass_setop(esymbol_t *name, eobject_t value, ecode_t code);

extern etag_t *
eclass_incdec(esymbol_t *name, ebool_t post, ecode_t code);

extern etag_t *
eclass_address(esymbol_t *name);

extern etag_t *
eaddress_load(eobject_t list);

extern etag_t *
epointer_load(eobject_t list);

extern etag_t *
epointer_store(eobject_t list, eobject_t value);

extern etag_t *
epointer_setop(eobject_t list, eobject_t value, ecode_t code);

extern etag_t *
epointer_incdec(eobject_t list, ebool_t post, ecode_t code);

extern etag_t *
evararg_load(eobject_t list);

extern etag_t *
evararg_store(eobject_t list, eobject_t value);

extern etag_t *
evararg_setop(eobject_t list, eobject_t value, ecode_t code);

extern etag_t *
evararg_incdec(eobject_t list, ebool_t post, ecode_t code);

extern etag_t *
evararg_address(eobject_t list);

extern etag_t *
ehash_load(eobject_t list);

extern etag_t *
ehash_store(eobject_t list, eobject_t value);

extern etag_t *
ehash_setop(eobject_t list, eobject_t value, ecode_t code);

extern etag_t *
ehash_incdec(eobject_t list, ebool_t post, ecode_t code);

extern etag_t *
eobject_load(eobject_t list);

extern etag_t *
eobject_store(eobject_t list, eobject_t value);

extern etag_t *
eobject_setop(eobject_t list, eobject_t value, ecode_t code);

extern etag_t *
eobject_incdec(eobject_t list, ebool_t post, ecode_t code);

extern etag_t *
eobject_address(eobject_t list);

/*
 * Externs
 */
extern etag_t *data_tag;

#endif /* _edata_h */
